Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / frontend / NomadPageRenderer.test.js

Displaying Raw • Download


tests/frontend/NomadPageRenderer.test.js bce42bcdce0e7d2c6d78228e864a4cd1d974cc82 (bce42bcd) Text, 6.32 KB

Tff7b72import Tb4b4b4{ Te6edf3describeTb4b4b4, Te6edf3expectTb4b4b4, Te6edf3itTb4b4b4, Te6edf3beforeEachTb4b4b4, Te6edf3afterEach Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Te6edf3MicronParser Tff7b72from Ta5d6ff"../../meshchatx/src/frontend/js/MicronParser"Tb4b4b4;
Tff7b72import Tb4b4b4{
Te6edf3escapeNomadPlainTextTb4b4b4,
Te6edf3renderNomadHtmlPageTb4b4b4,
Te6edf3renderNomadMarkdownTb4b4b4,
Te6edf3renderNomadPageByPathTb4b4b4,
Te6edf3resolveNomadPageShellBackgroundTb4b4b4,
Te6edf3sanitizeNomadHtmlFragmentTb4b4b4,
Tb4b4b4} Tff7b72from Ta5d6ff"../../meshchatx/src/frontend/js/NomadPageRenderer"Tb4b4b4;

Te6edf3describeTb4b4b4(Ta5d6ff"NomadPageRenderer"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"renders markdown to safe HTML without script tags"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3html Tff7b72= Te6edf3renderNomadMarkdownTb4b4b4(Ta5d6ff"# Title\n\n[x](javascript:alert(1))"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Title"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<script"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"javascript:"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"normalizes ATX headings when space is missing after hashes"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3html Tff7b72= Te6edf3renderNomadMarkdownTb4b4b4(Ta5d6ff"#Hello\n\n##There\n\n####Deep"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<h1"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Hello"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<h2"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<h4"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"wraps markdown in nomad-markdown container"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3html Tff7b72= Te6edf3renderNomadMarkdownTb4b4b4(Ta5d6ff"x"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="nomad-markdown"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"strips external http links from markdown output"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3html Tff7b72= Te6edf3renderNomadMarkdownTb4b4b4(Ta5d6ff"[a](https://evil.example/)"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"evil.example"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"allows nomad-style href on links after sanitization"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3html Tff7b72= Te6edf3renderNomadMarkdownTb4b4b4(Ta5d6ff"[local](:page/other.mu)"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff":page/other.mu"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"sanitizes HTML documents and removes script"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3html Tff7b72= Te6edf3renderNomadHtmlPageTb4b4b4(
Ta5d6ff"<!DOCTYPE html><html><head><style>body{color:red}</style></head><body><p>Hi</p><script>x</script></body></html>"
Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<script"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Hi"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"nomad-html-root"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff".nomad-html-root"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"color:red"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"removes iframe and external stylesheet references from HTML"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3html Tff7b72= Te6edf3renderNomadHtmlPageTb4b4b4(
Ta5d6ff'<html><head><link rel="stylesheet" href="https://evil.example/s.css"/></head><body><iframe src="https://x"></iframe><p>x</p></body></html>'
Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"iframe"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"evil.example"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"escapes plain text pages"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3out Tff7b72= Te6edf3escapeNomadPlainTextTb4b4b4(Ta5d6ff"<script>bad</script>"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3outTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<script>"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3outTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"&lt;script&gt;"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"renderNomadPageByPath picks format by extension"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3dest Tff7b72= Ta5d6ff"a"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3muHtml Tff7b72= Te6edf3renderNomadPageByPathTb4b4b4(Ta5d6ff`Tffd700${Te6edf3destTffd700}Ta5d6ff:/page/x.muTa5d6ff`Tb4b4b4, Ta5d6ff"Hello mesh"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3MicronParserTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72typeof Te6edf3muHtmlTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"string"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3muHtmlTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3toBeGreaterThanTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3renderNomadPageByPathTb4b4b4(Ta5d6ff"/page/a.md"Tb4b4b4, Ta5d6ff"# T"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3MicronParserTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"T"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3renderNomadPageByPathTb4b4b4(Ta5d6ff"/page/a.txt"Tb4b4b4, Ta5d6ff"a<b>"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3MicronParserTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"&lt;"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3renderNomadPageByPathTb4b4b4(Ta5d6ff"/page/a.html"Tb4b4b4, Ta5d6ff'<p class="x">z</p>'Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3MicronParserTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"z"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"renderNomadPageByPath respects disabled markdown and html"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3mdOff Tff7b72= Te6edf3renderNomadPageByPathTb4b4b4(Ta5d6ff"/page/a.md"Tb4b4b4, Ta5d6ff"# Title"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3MicronParserTb4b4b4, Tb4b4b4{
Te6edf3renderMarkdownTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3mdOffTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<h1"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3mdOffTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Title"Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3htmlOff Tff7b72= Te6edf3renderNomadPageByPathTb4b4b4(Ta5d6ff"/page/a.html"Tb4b4b4, Ta5d6ff"<p>x</p>"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3MicronParserTb4b4b4, Tb4b4b4{
Te6edf3renderHtmlTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlOffTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<p>"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3htmlOffTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"&lt;"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"renderNomadPageByPath respects disabled plaintext for .txt"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3on Tff7b72= Te6edf3renderNomadPageByPathTb4b4b4(Ta5d6ff"/page/a.txt"Tb4b4b4, Ta5d6ff"line"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3MicronParserTb4b4b4, Tb4b4b4{ Te6edf3renderPlaintextTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3off Tff7b72= Te6edf3renderNomadPageByPathTb4b4b4(Ta5d6ff"/page/a.txt"Tb4b4b4, Ta5d6ff"line"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3MicronParserTb4b4b4, Tb4b4b4{ Te6edf3renderPlaintextTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3onTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"whitespace-pre-wrap"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3offTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<pre"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"sanitizeNomadHtmlFragment handles arbitrary strings without throwing"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3sanitizeNomadHtmlFragmentTb4b4b4(Ta5d6ff"<div>ok</div>"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"fuzzing: handles random strings in markdown and HTML sanitization"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff200Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3s Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72const Te6edf3len Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff800Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3lenTb4b4b4; Te6edf3jTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3s Tff7b72+= Tffa657StringTb4b4b4.Te6edf3fromCharCodeTb4b4b4(Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff65536Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3renderNomadMarkdownTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3sanitizeNomadHtmlFragmentTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3renderNomadHtmlPageTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3describeTb4b4b4(Ta5d6ff"resolveNomadPageShellBackground"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72let Te6edf3hostTb4b4b4;

Te6edf3beforeEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3host Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"div"Tb4b4b4)Tb4b4b4;
Tffa657documentTb4b4b4.Te6edf3bodyTb4b4b4.Te6edf3appendChildTb4b4b4(Te6edf3hostTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3afterEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3hostTff7b72?Tb4b4b4.Te6edf3removeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"returns null when root has no painted background"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3root Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"div"Tb4b4b4)Tb4b4b4;
Te6edf3rootTb4b4b4.Te6edf3className Tff7b72= Ta5d6ff"nomad-html-root"Tb4b4b4;
Te6edf3hostTb4b4b4.Te6edf3appendChildTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resolveNomadPageShellBackgroundTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"reads background-color from the html root"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3root Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"div"Tb4b4b4)Tb4b4b4;
Te6edf3rootTb4b4b4.Te6edf3className Tff7b72= Ta5d6ff"nomad-html-root"Tb4b4b4;
Te6edf3rootTb4b4b4.Te6edf3styleTb4b4b4.Te6edf3backgroundColor Tff7b72= Ta5d6ff"rgb(18, 24, 38)"Tb4b4b4;
Te6edf3hostTb4b4b4.Te6edf3appendChildTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resolveNomadPageShellBackgroundTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"rgb(18, 24, 38)"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"reads background from a direct child when root is transparent"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3root Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"div"Tb4b4b4)Tb4b4b4;
Te6edf3rootTb4b4b4.Te6edf3className Tff7b72= Ta5d6ff"nomad-html-root"Tb4b4b4;
Tff7b72const Te6edf3inner Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"div"Tb4b4b4)Tb4b4b4;
Te6edf3innerTb4b4b4.Te6edf3styleTb4b4b4.Te6edf3backgroundColor Tff7b72= Ta5d6ff"rgb(40, 40, 40)"Tb4b4b4;
Te6edf3rootTb4b4b4.Te6edf3appendChildTb4b4b4(Te6edf3innerTb4b4b4)Tb4b4b4;
Te6edf3hostTb4b4b4.Te6edf3appendChildTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resolveNomadPageShellBackgroundTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"rgb(40, 40, 40)"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────